<?xml version = '1.0' encoding = 'UTF-8'?>
<HBRRepo><variables><variable name="OQP_Scenario" type="member" usage="const" id="2" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Scenario</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_SCENARIO</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Version" type="member" usage="const" id="1" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Version</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_VERSION</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Year" type="member" usage="const" id="3" product="Planning"><property name="application">SalesPln</property><property name="dimension">Years</property><property name="dimensionInputMode">name</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_YEAR</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable></variables><rulesets/><rules><rule id="1" name="OQP_Set Overlay Target" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="seeded">true</property><variable_references><variable_reference name="OQP_Scenario" id="2"><property name="application">SalesPln</property><property name="hidden">false</property><property name="rule_name">OQP_Set Overlay Target</property><property name="seq">1</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">OEP_Plan</property></variable_reference><variable_reference name="OQP_Version" id="1"><property name="application">SalesPln</property><property name="hidden">false</property><property name="rule_name">OQP_Set Overlay Target</property><property name="seq">2</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">OEP_Working</property></variable_reference><variable_reference name="OQP_Year" id="3"><property name="application">SalesPln</property><property name="hidden">false</property><property name="rule_name">OQP_Set Overlay Target</property><property name="seq">3</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">No Year</property></variable_reference></variable_references><script type="groovy">			/*RTPS:{OQP_Version} {OQP_Scenario} {OQP_Year}*/
            /*PURPOSE: This rule calculates Ovelay Target Quota Based on percentage input and adjustment value*/
			String Scenario=rtps.OQP_Scenario.member.name;
			String Version=rtps.OQP_Version.member.name;			
			String Year=rtps.OQP_Year.member.name;
			List&lt;String> CustomDimensions=[];
			List&lt;String> CustomDimMembers=[];
			List&lt;String> CustomIDescDimensions=[];
			boolean isDataModified = false;
			String strRowDim;
			String strColDim;
			boolean isUnitsModel =false;
			String driverDimMember;
			List&lt;String> ColumnDimensions =[];
			List&lt;String> RowDimensions =[];
			List&lt;String> NewColumnDims =[];
			String strCrossDim = "";
            int iCnt;
			try
			{
            	/*Evalute if Quota planning model is enabled for units or  Amount */
				Application app=operation.getApplication();
				 Cube qtp=operation.getCube(); 
				Dimension dim=app.getDimension(DimensionType.ACCOUNT,qtp);
				if (dim.hasMember("OQP_Units",qtp)==true)
				{
					isUnitsModel=true;
					driverDimMember="OQP_Last Year Impacted Units";
				}
				else
				{
					isUnitsModel=false;
					driverDimMember="OQP_Last Year Impacted Revenue";                    
				}

		   /*Identify POV Dimensoins and their members*/
			def grid=operation.grid;
			List&lt;DataGrid.HeaderCell> hcells=grid.getPov()
            hcells.each{
				def dimName = it.getDimName();
				String mbrName=it.getMbrName();
				if (!mbrName.equals(Version) &amp;&amp; !it.getDimensionType().equals(DimensionType.SIMPLE_CURRENCY)  &amp;&amp; !mbrName.equals(Year) &amp;&amp; !mbrName.equals(Scenario) )
				{
					CustomDimensions.add('''@Relative("'''+mbrName+'''",0)''');
					CustomDimMembers.add('''"'''+mbrName+'''"''')
					strCrossDim= strCrossDim + "\""+ mbrName+"\"->"
					CustomIDescDimensions.add('''"'''+dimName+'''"''');
				}
			
            }	
            
			StringBuilder cscript = new StringBuilder();
			cscript.append('''SET AGGMISSG ON;\n''');
			cscript.append('''SET UPDATECALC OFF;\n''');
			cscript.append('''FIX(@Relative("Yeartotal",0),"'''+ Year +'''",''')
			cscript.append ('''"'''+Version+'''"''')
			cscript.append (''',"'''+Scenario+'''"''')
			if (app.getCurrencyMode()!=CurrencyMode.SINGLE_CURRENCY)
			{
				String sCurrency =  operation.grid.pov.find { it.dimName == 'Currency' }.essbaseMbrName 
                //cscript.append (''',"'''+app.getDefaultCurrency()+'''"''')
                cscript.append (''',"'''+ sCurrency +'''"''')
			}
			cscript.append (''')\n''')
            /*Get Members of Row Dimensions*/
			List&lt;DataGrid.Row> rows = grid.getRows()
			for (DataGrid.Row row : rows) 
			{
				List&lt;DataGrid.HeaderCell> subRows = row.getHeaders();
				for(DataGrid.HeaderCell cell : subRows) 
				  {
					String memName = cell.getDimName();  
				  if (!RowDimensions.contains(memName))
				   {
						RowDimensions.add(memName)      	 
				   }     	 
				 }        
			}
            /*Get Members of Column dimensions */
			List&lt;List&lt;DataGrid.HeaderCell>> cols = grid.getColumns();
			for (List&lt;DataGrid.HeaderCell> cells : cols) 
			{
			 
				for (DataGrid.HeaderCell cell : cells)  
				  {
				   String memName = cell.getMbrName();
				   String dimName = cell.getDimName();
				   if (!ColumnDimensions.contains(dimName))
					  {
						if (memName.equals("YearTotal") || memName.equals(driverDimMember)  )
						{
							ColumnDimensions.add(dimName)
						}
						else
						{
						 if(!NewColumnDims.contains(dimName))	
								{
									NewColumnDims.add(dimName)
								}
						}
				   
					 }   	
				 }
						   
			 }
			 
            if(operation.application.hasDimension('Territory', qtp) == true) 
            {
            	strRowDim = operation.grid.getCellWithMembers().getMemberName("Territory")
            }
            else
            {
            	strRowDim = operation.grid.getCellWithMembers().getMemberName("Resource")
            }

			if (NewColumnDims.size() == 1)
			{
			 def Column=operation.grid.dataCellIterator{DataCell cell -> cell.edited}.collect([] as Set,{ DataCell cell ->
				cell.getMemberName(NewColumnDims[0])
			})
			strColDim=Column[0]
			}
			if (strRowDim!=null)
			{
			strCrossDim= strCrossDim + "\""+ strRowDim+"\"->"
			}
			if (strColDim!=null)
			{
			strCrossDim= strCrossDim + "\""+strColDim+"\"->"
			}

			/*Calculates Overlay Quota*/
			cscript.append('''	FIX(@RELATIVE("'''+strRowDim+'''",0)''')
			if (strColDim!=null)
			{
            	CustomIDescDimensions.add('''"'''+strColDim+'''"''')
				cscript.append(''',@Relative("'''+strColDim+'''",0),''')
			}
            if (CustomDimensions.size()>0)
            {
            	cscript.append(''','''+ CustomDimensions.join(''','''))
			}
			cscript.append(''')\n''')
			cscript.append('''		"OQP_Overlay Quota" \n''')
			cscript.append('''			( \n''')
			cscript.append('''				"OQP_Overlay Quota" = ((1+('''+ strCrossDim +'''"OQP_Overlay Growth%"->"BegBalance"))* "'''+driverDimMember+'''");\n''')
			cscript.append('''			) \n''')
			cscript.append('''	ENDFIX; \n''')
            /*Aggregation of Overlay Quota*/
            cscript.append('''	FIX("OQP_Overlay Quota")\n''')                
            if (CustomIDescDimensions.size()>1)
             {
             	for (iCnt=0;iCnt&lt;CustomIDescDimensions.size()-1;iCnt++)
                {
                cscript.append('''			FIX(@RELATIVE('''+CustomIDescDimensions[iCnt]+''',0))\n''')              
                }                
                for (iCnt=CustomIDescDimensions.size()-1;iCnt>0;iCnt--)
                {
                cscript.append('''				AGG('''+CustomIDescDimensions[iCnt]+''');\n''')                        
                cscript.append('''			ENDFIX\n''')
                }
                cscript.append('''			AGG('''+CustomIDescDimensions[0]+''');\n''')
                
            }
            if (CustomDimensions.size()==1)
            {
            	cscript.append('''	 		AGG('''+CustomIDescDimensions[0]+''');\n''')
                           
            }
            cscript.append('''		@IDESCENDANTS("'''+strRowDim+'''");\n''')			
			cscript.append('''	ENDFIX; \n''')
            
            if (CustomDimMembers.size()>0)
            {
            cscript.append('''	FIX("BegBalance",@DESCENDANTS("'''+strRowDim+'''"),'''+CustomDimMembers.join(''',''')+''')\n''')
            cscript.append('''				"OQP_Overlay Growth%"''')
			cscript.append('''				( \n''')
			cscript.append('''					"OQP_Overlay Growth%"  = (("OQP_Overlay Quota"->"YearTotal"-"'''+driverDimMember+'''"->"YearTotal")/ "'''+driverDimMember+'''"->"YearTotal");\n''')
			cscript.append('''				) \n''')
            
            cscript.append('''	ENDFIX\n''')
            }
            
			cscript.append('''ENDFIX; \n''')
            println (cscript.toString())
			return cscript.toString()			
			}catch(all) {
				throw new HspRuntimeException('Error occured while executing business rule');
			}		 
				 
		 
		</script></rule></rules><components/><deployobjects><deployobject product="2" application="salespln" plantype="oep_qtp" obj_id="1" obj_type="1" name="OQP_SET OVERLAY TARGET"/></deployobjects></HBRRepo>